package org.linearlist;

/**
 * @author: 默苍璃
 * @date: 2023-04-11 11:59
 * <p>
 * 链队列
 */
public class LinkQueue<T> {

    private Node<T> front, rear;
    private int length;

    /**
     * 初始化链队列
     * 构造一个空的队列
     */
    public LinkQueue() {
        length = 0;
        //带有表头结点的链表
        front = rear = new Node<T>(null);
    }               //

    /**
     * 入队
     * 在队列的队尾插入一个新元素
     *
     * @param obj
     */
    public void enQueue(T obj) {
        rear = rear.next = new Node<T>(obj, null);
        length++;
    }


    /**
     * 出队
     * 删除队列队头元素
     *
     * @return
     */
    public T deQueue() {
        if (isEmpty()) {
            System.out.println("队列已空，无法出队！");
            return null;
        }
        Node<T> p = front.next;
        T x = p.data;
        front.next = p.next;
        length--;
        if (front.next == null) {
            rear = front;
        }
        return x;
    }

    /**
     * 取队列队头元素
     *
     * @return
     */
    public T getHead() {
        if (isEmpty()) {
            System.out.println("队列已空，无法读取元素！");
            return null;
        }
        return front.next.data;
    }

    /**
     * 求出队列中数据元素的个数
     *
     * @return
     */
    public int size() {
        return length;
    }

    /**
     * 判断当前队列是否为空
     *
     * @return
     */
    public boolean isEmpty() {
        return front.next == null;
    }

    /**
     * 依次访问队列中每个元素并输出
     */
    public void nextOrder() {
        Node<T> p = front.next;
        while (p != null) {
            System.out.println(p.data);
            p = p.next;
        }
    }

    /**
     * 清空队列
     */
    public void clear() {
        front.next = rear.next = null;
    }

}
